## Le temps : ## La dépendance oubliée
Baptiste Langlade [@baptouuuu](https://twitter.com/baptouuuu) Dev chez Opéra Energie

Evolution ces dernières années

## La tendance Note: réflexion sur notre métier
## Le but Note: testabilité et maintenabilité de nos apps
## Leçons apprises Note: * injection des dépendances * l'état global cémal
```php function myCode() { return Http::get(...); } ``` vs ```php function myCode($http) { return $http->get(...); } ```
```php global $value; function increment() { global $value; ++$value; } ``` vs ```php $value = function myCode($value) { return ++$value; } ```
## Malgré tout ça...
![](pictures/phpunit.png) Note: * 29 février * changement d'heure
## La raison ```php # Order.php public function withdrawalPeriodOver(): bool { $now = new \DateTime('now'); return $this->delivery->diff($now) > new \DateInterval('P15D'); } ```
## Premier problème Dépendance au temps non explicite du point de vue de l'utilisateur ```withdrawalPeriodOver()``` donnée fixe ou calculée? ¯\\_(ツ)_/¯
## Deuxième problème 2 instanciations avec le même paramètre produit un résultat différent La classe dépend donc d'un état global qui change à chaque instanciation
## Une solution Le pattern de l'horloge
Interface ultra minimaliste ```php interface Clock { public function now(): \DateTimeImmutable; } ``` Implémentation de base ```php public function now(): \DateTimeImmutable { return new \DateTimeImmutable('now'); } ```
```php # Order.php public function withdrawalPeriodOver(Clock $clock): bool { $period = $this->delivery->diff($clock->now()); return $period > new \DateInterval('P15D'); } ``` * dépendance explicite * état local à l'horloge
## Avantages : * le temps est une dépendance comme une autre * (réel) test unitaire sur le temps * facile à mocker * on peut tester tous les cas particuliers * rejouer toute l'app à un moment particulier dans le passé (ou le futur)
## Pousser la réflexion un peu plus La sémantique
  • "Ubiquitous language"
  • Déclaratif > impératif
Code impératif ```php $now = $clock->now(); $diff = $now->diff($this->delivery); $diff > new DateInterval('P15D'); ```
Code déclaratif ```php $clock ->now() ->elapsedSince($this->delivery) ->longerThan(new WithdrawalPeriod); ```
## Si vous voulez vous amuser [github.com/innmind/TimeContinuum](https://github.com/innmind/TimeContinuum)
Le temps : la dépendance oubliée # Questions Twitter @Baptouuuu Github @Baptouuuu